<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>哈啰租车 h5 | Lampow燃的博客</title>
    <meta name="generator" content="VuePress 1.9.9">
    <link rel="icon" href="/blog/assets/img/vincentRan.ico">
    <link rel="manifest" href="/blog/manifest.json">
    <script src="/blog/scripts/global.js"></script>
    <script src="/blog/assets/js/autopush-baidu.js"></script>
    <script src="/blog/assets/js/autopush-360.js"></script>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui">
    <meta name="baidu-site-verification" content="gZcjfbZtAw">
    <meta name="google-site-verification" content="cEMNM1qDYFHDq8a4c2uT9n_3yX6kCJ4KolTcLk9DhV4">
    <meta name="360-site-verification" content="8b6f7e9dff6da70522ce0d5ae8ffd923">
    <meta name="author" content="Lampow燃">
    <meta name="keywords" content="vincentRan;Lampow燃;js;Javascript基础;前端;博客">
    <meta name="theme-color" content="#3eaf7c">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="msapplication-TileColor" content="#000000">
    
    <link rel="preload" href="/blog/assets/css/0.styles.b6bf8ae6.css" as="style"><link rel="preload" href="/blog/assets/js/app.7b4540b9.js" as="script"><link rel="preload" href="/blog/assets/js/2.b0da3abb.js" as="script"><link rel="preload" href="/blog/assets/js/15.2996c9e2.js" as="script"><link rel="preload" href="/blog/assets/js/4.e142f4c4.js" as="script"><link rel="preload" href="/blog/assets/js/11.d9c57454.js" as="script"><link rel="preload" href="/blog/assets/js/6.e0517a23.js" as="script"><link rel="prefetch" href="/blog/assets/js/10.fad52a34.js"><link rel="prefetch" href="/blog/assets/js/12.67814a82.js"><link rel="prefetch" href="/blog/assets/js/13.dff6097c.js"><link rel="prefetch" href="/blog/assets/js/14.63aca277.js"><link rel="prefetch" href="/blog/assets/js/16.97a52145.js"><link rel="prefetch" href="/blog/assets/js/17.cd17994a.js"><link rel="prefetch" href="/blog/assets/js/18.ac420f2a.js"><link rel="prefetch" href="/blog/assets/js/19.eb6b91bf.js"><link rel="prefetch" href="/blog/assets/js/20.cb363eca.js"><link rel="prefetch" href="/blog/assets/js/21.a4e99c33.js"><link rel="prefetch" href="/blog/assets/js/22.694a6ec1.js"><link rel="prefetch" href="/blog/assets/js/23.55cb3c0d.js"><link rel="prefetch" href="/blog/assets/js/24.0f31eaf1.js"><link rel="prefetch" href="/blog/assets/js/25.2eefb2bd.js"><link rel="prefetch" href="/blog/assets/js/26.9375d9cc.js"><link rel="prefetch" href="/blog/assets/js/27.15116a38.js"><link rel="prefetch" href="/blog/assets/js/28.19eef588.js"><link rel="prefetch" href="/blog/assets/js/29.49bf907e.js"><link rel="prefetch" href="/blog/assets/js/3.d02dbad1.js"><link rel="prefetch" href="/blog/assets/js/30.a3b1e05f.js"><link rel="prefetch" href="/blog/assets/js/31.e816c5a5.js"><link rel="prefetch" href="/blog/assets/js/32.0de6aa66.js"><link rel="prefetch" href="/blog/assets/js/33.0d6966b1.js"><link rel="prefetch" href="/blog/assets/js/34.9b7e8e14.js"><link rel="prefetch" href="/blog/assets/js/35.df38e2a9.js"><link rel="prefetch" href="/blog/assets/js/36.3f437700.js"><link rel="prefetch" href="/blog/assets/js/37.2c1de8b3.js"><link rel="prefetch" href="/blog/assets/js/38.86e11044.js"><link rel="prefetch" href="/blog/assets/js/39.82741cfc.js"><link rel="prefetch" href="/blog/assets/js/40.1e6de0bd.js"><link rel="prefetch" href="/blog/assets/js/41.5b9a2f33.js"><link rel="prefetch" href="/blog/assets/js/42.dbe88c0f.js"><link rel="prefetch" href="/blog/assets/js/43.48e12a76.js"><link rel="prefetch" href="/blog/assets/js/44.c5a6663b.js"><link rel="prefetch" href="/blog/assets/js/45.38f327a2.js"><link rel="prefetch" href="/blog/assets/js/46.527a0e03.js"><link rel="prefetch" href="/blog/assets/js/47.b8baaa72.js"><link rel="prefetch" href="/blog/assets/js/48.3447a56d.js"><link rel="prefetch" href="/blog/assets/js/49.cd301a0f.js"><link rel="prefetch" href="/blog/assets/js/5.d43d130b.js"><link rel="prefetch" href="/blog/assets/js/50.644742a2.js"><link rel="prefetch" href="/blog/assets/js/51.ae6a8437.js"><link rel="prefetch" href="/blog/assets/js/52.dfcb8f83.js"><link rel="prefetch" href="/blog/assets/js/53.2a0715a8.js"><link rel="prefetch" href="/blog/assets/js/54.fe7d4a37.js"><link rel="prefetch" href="/blog/assets/js/55.457aa0d9.js"><link rel="prefetch" href="/blog/assets/js/56.dc026f76.js"><link rel="prefetch" href="/blog/assets/js/57.dfa47cb4.js"><link rel="prefetch" href="/blog/assets/js/58.8dfdbcbb.js"><link rel="prefetch" href="/blog/assets/js/59.67f5108d.js"><link rel="prefetch" href="/blog/assets/js/60.73f12c35.js"><link rel="prefetch" href="/blog/assets/js/61.a6281041.js"><link rel="prefetch" href="/blog/assets/js/62.a1672f34.js"><link rel="prefetch" href="/blog/assets/js/63.65b641c6.js"><link rel="prefetch" href="/blog/assets/js/64.01018dd4.js"><link rel="prefetch" href="/blog/assets/js/65.e7ffb165.js"><link rel="prefetch" href="/blog/assets/js/66.173f5f61.js"><link rel="prefetch" href="/blog/assets/js/67.5f7af08d.js"><link rel="prefetch" href="/blog/assets/js/68.d87b9899.js"><link rel="prefetch" href="/blog/assets/js/69.18f0835e.js"><link rel="prefetch" href="/blog/assets/js/7.da19f9b0.js"><link rel="prefetch" href="/blog/assets/js/70.9090fddd.js"><link rel="prefetch" href="/blog/assets/js/71.dd4e6e2c.js"><link rel="prefetch" href="/blog/assets/js/72.c42d4bf3.js"><link rel="prefetch" href="/blog/assets/js/73.5c5defd2.js"><link rel="prefetch" href="/blog/assets/js/74.b12fdeee.js"><link rel="prefetch" href="/blog/assets/js/75.7f085fdb.js"><link rel="prefetch" href="/blog/assets/js/76.f2d01ffb.js"><link rel="prefetch" href="/blog/assets/js/77.23a7ce10.js"><link rel="prefetch" href="/blog/assets/js/78.3b39d101.js"><link rel="prefetch" href="/blog/assets/js/79.42d64efd.js"><link rel="prefetch" href="/blog/assets/js/8.00fa029c.js"><link rel="prefetch" href="/blog/assets/js/80.64996c95.js"><link rel="prefetch" href="/blog/assets/js/81.a15f0118.js"><link rel="prefetch" href="/blog/assets/js/82.726c1156.js"><link rel="prefetch" href="/blog/assets/js/83.8b3a794d.js"><link rel="prefetch" href="/blog/assets/js/84.7cbe7d64.js"><link rel="prefetch" href="/blog/assets/js/85.3ec16acd.js"><link rel="prefetch" href="/blog/assets/js/86.41b3d3af.js"><link rel="prefetch" href="/blog/assets/js/87.c6e2a7c9.js"><link rel="prefetch" href="/blog/assets/js/88.4d4b145b.js"><link rel="prefetch" href="/blog/assets/js/89.04660517.js"><link rel="prefetch" href="/blog/assets/js/9.12b493d7.js"><link rel="prefetch" href="/blog/assets/js/90.9963ca39.js"><link rel="prefetch" href="/blog/assets/js/91.50f67c60.js"><link rel="prefetch" href="/blog/assets/js/92.f109d0d0.js"><link rel="prefetch" href="/blog/assets/js/93.5664c7c2.js"><link rel="prefetch" href="/blog/assets/js/94.889bd5e0.js"><link rel="prefetch" href="/blog/assets/js/95.cfcb0fb3.js">
    <link rel="stylesheet" href="/blog/assets/css/0.styles.b6bf8ae6.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/blog/" class="home-link router-link-active"><img src="/blog/assets/img/vincentRan.jpg" alt="Lampow燃的博客" class="logo"> <span class="site-name can-hide">Lampow燃的博客</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="工作台" class="dropdown-title"><span class="title">工作台</span> <span class="arrow down"></span></button> <button type="button" aria-label="工作台" class="mobile-dropdown-title"><span class="title">工作台</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/工作台/工作台.html" class="nav-link">
  工作台
</a></li><li class="dropdown-item"><h4>
          未来探索
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/未来探索/营销公司.html" class="nav-link">
  营销
</a></li><li class="dropdown-subitem"><a href="/blog/article/未来探索/野外单兵防护.html" class="nav-link">
  野外单兵防护
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="计算机原理" class="dropdown-title"><span class="title">计算机原理</span> <span class="arrow down"></span></button> <button type="button" aria-label="计算机原理" class="mobile-dropdown-title"><span class="title">计算机原理</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/计算机原理/CPU结构以及简单运行原理.html" class="nav-link">
  CPU结构以及简单运行原理
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/计算机原理/进程和线程.html" class="nav-link">
  进程和线程
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Javascript 基础" class="dropdown-title"><span class="title">Javascript 基础</span> <span class="arrow down"></span></button> <button type="button" aria-label="Javascript 基础" class="mobile-dropdown-title"><span class="title">Javascript 基础</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/数据类型.html" class="nav-link">
  数据类型
</a></li><li class="dropdown-item"><h4>
          关键字
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/通用关键字.html" class="nav-link">
  通用关键字
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/async &amp; await.html" class="nav-link">
  async &amp; await
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/new.html" class="nav-link">
  new
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/yield.html" class="nav-link">
  yield
</a></li></ul></li><li class="dropdown-item"><h4>
          常用内置对象
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Object.html" class="nav-link">
  Object
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Function.html" class="nav-link">
  Function
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/GeneratorFunction.html" class="nav-link">
  GeneratorFunction
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Promise.html" class="nav-link">
  Promise
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Reflect.html" class="nav-link">
  Reflect
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Array.html" class="nav-link">
  Array
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Set.html" class="nav-link">
  Set
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Proxy.html" class="nav-link">
  Proxy
</a></li></ul></li><li class="dropdown-item"><h4>
          构造函数-原型-原型链
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/构造函数.html" class="nav-link">
  构造函数
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/原型.html" class="nav-link">
  原型
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/原型链.html" class="nav-link">
  原型链
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/箭头函数.html" class="nav-link">
  箭头函数
</a></li></ul></li><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/1-4、数组操作.html" class="nav-link">
  数组操作
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/深浅拷贝.html" class="nav-link">
  引用类型之深拷贝浅拷贝
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/1-6、知识体系.html" class="nav-link">
  知识体系
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Javascript 进阶" class="dropdown-title"><span class="title">Javascript 进阶</span> <span class="arrow down"></span></button> <button type="button" aria-label="Javascript 进阶" class="mobile-dropdown-title"><span class="title">Javascript 进阶</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/js-upgrade/模块化/模块化.html" class="nav-link">
  模块化
</a></li><li class="dropdown-item"><h4>
          性能优化
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/性能优化/避免内存泄漏.html" class="nav-link">
  避免内存泄漏
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/性能优化/v8垃圾回收机制.html" class="nav-link">
  v8垃圾回收机制
</a></li></ul></li><li class="dropdown-item"><h4>
          编程范式
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程范式/编程范式.html" class="nav-link">
  编程范式
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程范式/面向对象_封装.html" class="nav-link">
  面向对象编程
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程范式/函数式编程.html" class="nav-link">
  函数式编程
</a></li></ul></li><li class="dropdown-item"><h4>
          编程原则
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程原则/编程原则.html" class="nav-link">
  编程原则
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程原则/Immutable原则.html" class="nav-link">
  Immutable原则
</a></li></ul></li><li class="dropdown-item"><h4>
          设计模式
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/设计模式/什么是设计模式.html" class="nav-link">
  什么是设计模式
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/设计模式/访问者模式.html" class="nav-link">
  访问者模式
</a></li></ul></li><li class="dropdown-item"><h4>
          常见算法
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/算法/贪心算法.html" class="nav-link">
  贪心算法
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/算法/LRU（least recently used）.html" class="nav-link">
  LRU（least recently used）
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="框架" class="dropdown-title"><span class="title">框架</span> <span class="arrow down"></span></button> <button type="button" aria-label="框架" class="mobile-dropdown-title"><span class="title">框架</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
          NestJS
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/NestJS/初始NestJS.html" class="nav-link">
  初始NestJS
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/NestJS/数据库.html" class="nav-link">
  数据库
</a></li></ul></li><li class="dropdown-item"><h4>
          typescript
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/初识TypeScript.html" class="nav-link">
  初识TypeScript
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/基本类型.html" class="nav-link">
  基本类型
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/进阶类型.html" class="nav-link">
  进阶类型
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/最佳实践.html" class="nav-link">
  最佳实践
</a></li></ul></li><li class="dropdown-item"><h4>
          React
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/react/基础用法.html" class="nav-link">
  基础用法
</a></li></ul></li><li class="dropdown-item"><h4>
          Vue
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/vue/生命周期&amp;执行过程.html" class="nav-link">
  生命周期&amp;执行过程
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/组件间通信.html" class="nav-link">
  组件间通信
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/自定义指令.html" class="nav-link">
  自定义指令
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/手撸ViewModel.html" class="nav-link">
  手撸ViewModel
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/源码解析/核心源码模块.html" class="nav-link">
  源码解析
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端工程化" class="dropdown-title"><span class="title">前端工程化</span> <span class="arrow down"></span></button> <button type="button" aria-label="前端工程化" class="mobile-dropdown-title"><span class="title">前端工程化</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
          持续集成与交付
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/前端工程化/CI&amp;CD/CI&amp;CD.html" class="nav-link">
  持续集成与交付
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/CI&amp;CD/编译打包/编译原理.html" class="nav-link">
  编译打包
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/CI&amp;CD/自动化测试/自动化测试.html" class="nav-link">
  自动化测试
</a></li></ul></li><li class="dropdown-item"><h4>
          脚手架开发
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/前端工程化/脚手架开发/npm原生/npm脚手架开发.html" class="nav-link">
  npm原生
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/脚手架开发/lerna库/快速上手.html" class="nav-link">
  lerna库
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/脚手架开发/commander/commander.html" class="nav-link">
  commander管理命令
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="工具代码" class="dropdown-title"><span class="title">工具代码</span> <span class="arrow down"></span></button> <button type="button" aria-label="工具代码" class="mobile-dropdown-title"><span class="title">工具代码</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/工具代码/正则.html" class="nav-link">
  正则
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/工具代码/浏览器扩展.html" class="nav-link">
  浏览器扩展
</a></li><li class="dropdown-item"><h4>
          轮子系列
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/订阅发布模式.html" class="nav-link">
  订阅发布模式
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/深拷贝.html" class="nav-link">
  深拷贝
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/Promise.html" class="nav-link">
  22行简洁的Promise
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/健壮的Promise.html" class="nav-link">
  健壮的Promise
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/节流and防抖.html" class="nav-link">
  节流and防抖
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/链表.html" class="nav-link">
  链表
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/Immer核心.html" class="nav-link">
  Immer核心
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/手写new.html" class="nav-link">
  手写new
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="web3D" class="dropdown-title"><span class="title">web3D</span> <span class="arrow down"></span></button> <button type="button" aria-label="web3D" class="mobile-dropdown-title"><span class="title">web3D</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/plan.html" class="nav-link">
  学习计划
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/WebGL2_Attr.html" class="nav-link">
  WebGL2 属性
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/WebGL2_API.html" class="nav-link">
  WebGL2 API
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/WebGL2_Interface.html" class="nav-link">
  WebGL2 接口
</a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="工作台" class="dropdown-title"><span class="title">工作台</span> <span class="arrow down"></span></button> <button type="button" aria-label="工作台" class="mobile-dropdown-title"><span class="title">工作台</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/工作台/工作台.html" class="nav-link">
  工作台
</a></li><li class="dropdown-item"><h4>
          未来探索
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/未来探索/营销公司.html" class="nav-link">
  营销
</a></li><li class="dropdown-subitem"><a href="/blog/article/未来探索/野外单兵防护.html" class="nav-link">
  野外单兵防护
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="计算机原理" class="dropdown-title"><span class="title">计算机原理</span> <span class="arrow down"></span></button> <button type="button" aria-label="计算机原理" class="mobile-dropdown-title"><span class="title">计算机原理</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/计算机原理/CPU结构以及简单运行原理.html" class="nav-link">
  CPU结构以及简单运行原理
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/计算机原理/进程和线程.html" class="nav-link">
  进程和线程
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Javascript 基础" class="dropdown-title"><span class="title">Javascript 基础</span> <span class="arrow down"></span></button> <button type="button" aria-label="Javascript 基础" class="mobile-dropdown-title"><span class="title">Javascript 基础</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/数据类型.html" class="nav-link">
  数据类型
</a></li><li class="dropdown-item"><h4>
          关键字
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/通用关键字.html" class="nav-link">
  通用关键字
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/async &amp; await.html" class="nav-link">
  async &amp; await
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/new.html" class="nav-link">
  new
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/关键字/yield.html" class="nav-link">
  yield
</a></li></ul></li><li class="dropdown-item"><h4>
          常用内置对象
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Object.html" class="nav-link">
  Object
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Function.html" class="nav-link">
  Function
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/GeneratorFunction.html" class="nav-link">
  GeneratorFunction
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Promise.html" class="nav-link">
  Promise
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Reflect.html" class="nav-link">
  Reflect
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Array.html" class="nav-link">
  Array
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Set.html" class="nav-link">
  Set
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/内置对象/Proxy.html" class="nav-link">
  Proxy
</a></li></ul></li><li class="dropdown-item"><h4>
          构造函数-原型-原型链
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/构造函数.html" class="nav-link">
  构造函数
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/原型.html" class="nav-link">
  原型
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/原型链.html" class="nav-link">
  原型链
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-basic/构造函数-原型-原型链/箭头函数.html" class="nav-link">
  箭头函数
</a></li></ul></li><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/1-4、数组操作.html" class="nav-link">
  数组操作
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/深浅拷贝.html" class="nav-link">
  引用类型之深拷贝浅拷贝
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/js-basic/1-6、知识体系.html" class="nav-link">
  知识体系
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Javascript 进阶" class="dropdown-title"><span class="title">Javascript 进阶</span> <span class="arrow down"></span></button> <button type="button" aria-label="Javascript 进阶" class="mobile-dropdown-title"><span class="title">Javascript 进阶</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/js-upgrade/模块化/模块化.html" class="nav-link">
  模块化
</a></li><li class="dropdown-item"><h4>
          性能优化
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/性能优化/避免内存泄漏.html" class="nav-link">
  避免内存泄漏
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/性能优化/v8垃圾回收机制.html" class="nav-link">
  v8垃圾回收机制
</a></li></ul></li><li class="dropdown-item"><h4>
          编程范式
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程范式/编程范式.html" class="nav-link">
  编程范式
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程范式/面向对象_封装.html" class="nav-link">
  面向对象编程
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程范式/函数式编程.html" class="nav-link">
  函数式编程
</a></li></ul></li><li class="dropdown-item"><h4>
          编程原则
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程原则/编程原则.html" class="nav-link">
  编程原则
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/编程原则/Immutable原则.html" class="nav-link">
  Immutable原则
</a></li></ul></li><li class="dropdown-item"><h4>
          设计模式
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/设计模式/什么是设计模式.html" class="nav-link">
  什么是设计模式
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/设计模式/访问者模式.html" class="nav-link">
  访问者模式
</a></li></ul></li><li class="dropdown-item"><h4>
          常见算法
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/算法/贪心算法.html" class="nav-link">
  贪心算法
</a></li><li class="dropdown-subitem"><a href="/blog/article/js-upgrade/算法/LRU（least recently used）.html" class="nav-link">
  LRU（least recently used）
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="框架" class="dropdown-title"><span class="title">框架</span> <span class="arrow down"></span></button> <button type="button" aria-label="框架" class="mobile-dropdown-title"><span class="title">框架</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
          NestJS
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/NestJS/初始NestJS.html" class="nav-link">
  初始NestJS
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/NestJS/数据库.html" class="nav-link">
  数据库
</a></li></ul></li><li class="dropdown-item"><h4>
          typescript
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/初识TypeScript.html" class="nav-link">
  初识TypeScript
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/基本类型.html" class="nav-link">
  基本类型
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/进阶类型.html" class="nav-link">
  进阶类型
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/typescript/最佳实践.html" class="nav-link">
  最佳实践
</a></li></ul></li><li class="dropdown-item"><h4>
          React
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/react/基础用法.html" class="nav-link">
  基础用法
</a></li></ul></li><li class="dropdown-item"><h4>
          Vue
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/框架/vue/生命周期&amp;执行过程.html" class="nav-link">
  生命周期&amp;执行过程
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/组件间通信.html" class="nav-link">
  组件间通信
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/自定义指令.html" class="nav-link">
  自定义指令
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/手撸ViewModel.html" class="nav-link">
  手撸ViewModel
</a></li><li class="dropdown-subitem"><a href="/blog/article/框架/vue/源码解析/核心源码模块.html" class="nav-link">
  源码解析
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端工程化" class="dropdown-title"><span class="title">前端工程化</span> <span class="arrow down"></span></button> <button type="button" aria-label="前端工程化" class="mobile-dropdown-title"><span class="title">前端工程化</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>
          持续集成与交付
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/前端工程化/CI&amp;CD/CI&amp;CD.html" class="nav-link">
  持续集成与交付
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/CI&amp;CD/编译打包/编译原理.html" class="nav-link">
  编译打包
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/CI&amp;CD/自动化测试/自动化测试.html" class="nav-link">
  自动化测试
</a></li></ul></li><li class="dropdown-item"><h4>
          脚手架开发
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/前端工程化/脚手架开发/npm原生/npm脚手架开发.html" class="nav-link">
  npm原生
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/脚手架开发/lerna库/快速上手.html" class="nav-link">
  lerna库
</a></li><li class="dropdown-subitem"><a href="/blog/article/前端工程化/脚手架开发/commander/commander.html" class="nav-link">
  commander管理命令
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="工具代码" class="dropdown-title"><span class="title">工具代码</span> <span class="arrow down"></span></button> <button type="button" aria-label="工具代码" class="mobile-dropdown-title"><span class="title">工具代码</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/工具代码/正则.html" class="nav-link">
  正则
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/工具代码/浏览器扩展.html" class="nav-link">
  浏览器扩展
</a></li><li class="dropdown-item"><h4>
          轮子系列
        </h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/订阅发布模式.html" class="nav-link">
  订阅发布模式
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/深拷贝.html" class="nav-link">
  深拷贝
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/Promise.html" class="nav-link">
  22行简洁的Promise
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/健壮的Promise.html" class="nav-link">
  健壮的Promise
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/节流and防抖.html" class="nav-link">
  节流and防抖
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/链表.html" class="nav-link">
  链表
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/Immer核心.html" class="nav-link">
  Immer核心
</a></li><li class="dropdown-subitem"><a href="/blog/article/工具代码/轮子系列/手写new.html" class="nav-link">
  手写new
</a></li></ul></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="web3D" class="dropdown-title"><span class="title">web3D</span> <span class="arrow down"></span></button> <button type="button" aria-label="web3D" class="mobile-dropdown-title"><span class="title">web3D</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/plan.html" class="nav-link">
  学习计划
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/WebGL2_Attr.html" class="nav-link">
  WebGL2 属性
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/WebGL2_API.html" class="nav-link">
  WebGL2 API
</a></li><li class="dropdown-item"><!----> <a href="/blog/article/web3D/webgl/WebGL2_Interface.html" class="nav-link">
  WebGL2 接口
</a></li></ul></div></div> <!----></nav>  <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>工作台</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/blog/article/工作台/工作台.html" class="sidebar-link">工作台</a></li><li><section class="sidebar-group collapsable is-sub-group depth-1"><p class="sidebar-heading"><span>未来探索</span> <span class="arrow right"></span></p> <!----></section></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>计算机原理</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Javascript 基础</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Javascript 进阶</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>框架</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>前端工程化</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>工具代码</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>web3D</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h2 id="哈啰租车-h5"><a href="#哈啰租车-h5" class="header-anchor">#</a> 哈啰租车 h5</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">11 张</div> <img src="/blog/assets/article/zuche/zuche_01.jpg" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、获取用户定位<br>
2、城市、商圈选择<br>
3、车型列表、快捷选择、商家列表、商家明细<br>
4、地图指引<br>
5、订单列表、订单详情<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>Vue2<br>
微信小程序 webview<br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>整个项目对前端要求极高，UI 还原基本是 1 像素级别，交互体验要求极高，正是因为这些近乎苛刻的要求才造就了这款精雕细琢的产品
作为租车项目前端主程，完成租车项目 70%功能点，目前大部分还在沿用
截至 2023-05，哈啰租车日活用户达到了 30w，还在稳步增长中</p></div> <h2 id="奇门小程序"><a href="#奇门小程序" class="header-anchor">#</a> 奇门小程序</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">6 张</div> <img src="/blog/assets/article/aboutMe/qimen3.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、全国网点定位，下拉选择<br>
2、日常分拣操作上报<br>
3、分拣方案查询选取（类似 C 端常用的城市选择列表，带快捷字母那种）<br>
4、备件申请上报<br>
5、任务列表<br>
6、异常提报报表<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>原生微信小程序</p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>从零开发奇门微信小程序，1 个月内独自一人实现所有前端功能，并且测试通过，成功上线。<br>
这个经历给了我很大的鼓舞，明白自己是有能力一个月内完成一个功能相对复杂的程序的。从技术选型到开发，到测试，到上线。领导也是看重了我这一点，3 年 2 次晋升，级别一路高升，然后开始管理团队</p></div> <h2 id="_2d-3d-可视化数据大屏"><a href="#_2d-3d-可视化数据大屏" class="header-anchor">#</a> 2D+3D 可视化数据大屏</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">5 张</div> <img src="/blog/assets/article/aboutMe/view3.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、支持数据实时更新<br>
2、支持根据配置渲染各个图表模块<br>
3、支持拖拽各个图表模块<br>
4、1366-1920 各个分辨率的适配，包括文案适配<br>
5、支持全屏<br>
6、支持 babylonjs 加载 3d 模型<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、<code>babylonjs</code><br>
2、flex、grid 布局<br>
3、echarts<br>
4、浏览器本地缓存、存储<br>
5、blender 优化模型体积，修改模型位置<br>
6、websocket 实现数据实时更新<br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>1、深刻感受了最新浏览器展示 3d 效果的流畅度，也体会到了浏览器渲染 3d 图像的瓶颈，顶点量大了之后除非显卡好，否则界面卡顿严重。<br>
2、顶点可以使模型很逼真，但是很耗性能，而且模型顶点量跟模型文件大小没有直接关系，很小的文件体积就可以描述很庞大的顶点数量。<br>
3、优化模型也不能一味地降低顶点数，否则模型锯齿将更严重。每个模型都有一个优化极限。<br></p></div> <h2 id="网点线上化"><a href="#网点线上化" class="header-anchor">#</a> 网点线上化</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">6 张</div> <img src="/blog/assets/article/aboutMe/网点线上化.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、实现网点新增、转让、合并、拆分、关停、审批六大流程填报<br>
2、所有流程都是动态、可配置的。包括位置，数量，状态全部是<code>数据驱动</code><br>
3、都有统一的底部操作控制，包括<code>取消、转办、保存并下一步、审批、修改、确认修改、取消修改</code><br>
4、流程任意节点都可返回之前步骤，重新操作，并从任意的切入点继续下一步<br>
5、所有数据都会保存临时草稿，在转办后，直接回填到界面<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、原生 js 递归，以及树操作能力提升<br>
2、<code>对 vue 混入理解更深刻</code><br>
3、<code>对 vuex 使用有了质的突破</code><br>
4、浏览器<code>本地存储</code>更加得心应手<br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>1、大型项目，多人合作一定要有人<code>统筹全局</code><br>
2、项目前端交互复杂，务必要进行<code>功能架构</code><br>
3、写复杂功能切勿深入太深，如果发现功能很难实现，及时停下来重整思绪，切勿一股脑往下写，优秀的功能应该是简单的，而不是写起来那么复杂<br>
4、深度了解需求之后方可进行开发。<code>越是复杂项目越要理解清晰产品的思路</code>，否则会导致多次返工<br>
5、树操作结合递归组件操作时，请务必保留 parent(父级)、child(子级)，vue 的模版编译 compile 也是深谙此道，将 parent 当作当前级，child 为下一级。因为递归树数据量庞大，如果你想抓住每份数据，那必定会被绕晕，我们只需要关注 parent、child 的关系即可<br></p></div> <h2 id="轻便巴枪单号上传系统"><a href="#轻便巴枪单号上传系统" class="header-anchor">#</a> 轻便巴枪单号上传系统</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">2 张</div> <img src="/blog/assets/article/aboutMe/baqiang.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、实现并封装 登陆、通讯、数据 I/O、GUI 绘制 等功能<br>
2、实现弱网环境下数据处理，防止丢数据<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、nodejs
2、sqlite 数据库</p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>因为是第一次架构，所以走了很多弯路。没有把握开发该系统的初衷，在功能封装上花了很大精力。 不过也收获了很多<br>
1、<code>资源把控</code>：<br>
（1）低配硬件环境下代码优化方式：开发，编译隔离，放在生产的最好是编译后的代码，不能为了开发体验放弃系统资源<br>
（2）弱网环境下功能优化方式（因为界面很简陋，所以只考虑数据层的优化）：数据先入本地库，不能影响核心扫码功能。然后异步上传，上传成功再去改变数据状态为成功，定期清理本地上传成功的数据<br>
2、做项目架构一定要综合考虑，不能只专注某一点，顺序很重要：<br>
（1）<code>清晰画像</code>：清晰用户画像 <br>
（2）<code>谨记初衷</code>：开发任何周期内都要谨记 领导/产品 核心理念，即项目启动初衷<br>
（3）<code>统筹资源</code>：包括人力、算力（硬件环境、软件环境）<br>
（4）<code>合理排期</code>：按阶段划分项目，制定合理的项目排期，不管什么项目，都需要考虑预留<code>测试</code>、<code>优化（界面优化、功能优化、性能优化）</code>时间<br>
（5）<code>技术设计</code>：开发方式设计、核心功能设计<br></p></div> <h2 id="集卡活动"><a href="#集卡活动" class="header-anchor">#</a> 集卡活动</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、3d 效果的虎卡卡牌，翻转以及滑动缩放功能<br>
2、主要使用了 lottie 动画<br>
3、实现了主流手机的流畅访问<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、React<br>
2、lottie<br>
3、低代码搭建平台<br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>1、lottie 动画可以用来开发流畅的，交互性强的活动页面，搭配 css，可以显著提升活动页的交互能力<br>
2、开发前期注意点：<br>
1）多人合作，一定要有人<code>主导项目</code>，前期定好人选，再开始动工<br>
2）开发前期，定好<code>关键节点</code>，以及每个节点该做的事<br>
3）没确定下来的东西一定要列好清单，<code>及时跟进</code><br>
4）项目开发不能只关注难点，要排好<code>优先级</code>再动工<br></p></div> <h2 id="骑行比赛活动"><a href="#骑行比赛活动" class="header-anchor">#</a> 骑行比赛活动</h2> <p><strong>有趣程度：<code>★★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">2 张</div> <img src="/blog/assets/article/aboutMe/baqiang.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、3d 效果的人物骑行比赛项目，包括
2、人物加速、减速<br>
2、更换刀具、奖品<br>
2、骑行里程展示<br>
2、节点动态发奖<br>
3、实现主流手机的流畅访问<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、React<br>
2、lottie<br>
3、低代码搭建平台<br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <h4 id="_1、开发前期注意点"><a href="#_1、开发前期注意点" class="header-anchor">#</a> 1、开发前期注意点</h4> <p>1）定好关键节点，以及每个节点该拿出的成果<br>
2）ui 没确定下来的东西一定要列好清单，积极跟进<br>
3）项目开发不能只关注难点，要排好优先级再动工<br>
4）不确定的功能一定要多预留处理时间<br></p> <h4 id="_2、开发模式确定"><a href="#_2、开发模式确定" class="header-anchor">#</a> 2、开发模式确定</h4> <p>1）评审、工时预估<br>
2）对照 ui，原型稿，抽离功能模块，分三个维度：ui-&gt;逻辑，全局-&gt;局部，简单-&gt;复杂<br>
3）整理出需求清单，根据清单定下：时间节点、优先级、结项对接人<br>
4）开始开发<br></p></div> <h2 id="收银台全栈项目"><a href="#收银台全栈项目" class="header-anchor">#</a> 收银台全栈项目</h2> <p><strong>有趣程度：<code>★★★</code></strong></p> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、支持扫码收银<br>
2、支持扫码铺货<br>
3、支持生成订单<br></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、<code>pnpm-workspace</code> 做 <code>monorepo</code> 项目管理<br>
2、前端 <code>react + vite</code> 支持路由懒加载<br>
3、服务端 <code>nestjs</code><br>
4、数据库 <code>mysql</code><br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>1、深刻理解程序应该是解决实际问题的，而<code>不是炫技</code>的，<code>稳定的功能才是重中之重</code><br>
2、深刻理解<code>数据是商品</code>，付费购买数据很正常。收集数据本来就是有成本的，我们只是给这个成本付费，就<code>像货物一样</code><br>
3、深刻理解前后端项目在做什么，前端为客户提供功能抽象，服务端为用户功能提供功能支持，数据库为服务端提供数据支持<br>
3、一个软件对于用户来说是不可分割的整体，对于前端来说，尽量让用户使用起来不产生割裂感，很重要<br></p></div> <h2 id="sprite-design-可视化搭建系统-架构"><a href="#sprite-design-可视化搭建系统-架构" class="header-anchor">#</a> Sprite-Design 可视化搭建系统-架构</h2> <p><strong>有趣程度：<code>★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">4 张</div> <img src="/blog/assets/article/aboutMe/sd1.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、拖拽组件组合生成页面<br>
2、快捷的组件开发方式-只有 4 个类型数据，样式数据、通信数据、交互数据、行为数据。<br>
3、服务端数据交互<br>
4、复杂交互设计-引入<code>交互线</code></p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p> <p>1、vue2+vuecli<br>
2、原生 js<br></p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>这个项目很久之前就想提出来了，但是因为是个人项目，一直没时间启去动，一次契机，由领导层提起，突然觉得应该重新拾起来了，然后越想越觉得可行，这个项目未来前景很广阔，如果和 <code>web3D</code> 结合起来，必定会刮起 web3.0 的浪潮<br>
1、利用多种工具搭配使用，丰富了架构文档的内容，美化了架构文档的界面，主要工具有：ps、ppt、xmind、processon 流程图、配色网站+自己的色感<br>
2、进一步夯实架构能力，综合考虑了多方因素，如：项目背景、运行环境、业务目标和产品指标，也考虑了风险限制以及解决方案<br>
3、Sprite-Design 核心是拖拽，为什么拖拽能引领下一代交互呢。其实现在利用摄像头跟踪、红外线跟踪技术，手势与电脑交互已经实现了，因为手势更符合常人生存的环境，我们用手穿衣、用手吃饭、用手开车、用手工作...。所以手势交互是大势所趋。而拖拽也迎合了手势这种交互方式，都是由手触发，两者不冲突！</p></div> <h2 id="福临小程序"><a href="#福临小程序" class="header-anchor">#</a> 福临小程序</h2> <p><strong>有趣程度：<code>★★★</code></strong></p> <div class="img-container project-preview"><div><div class="count-info">2 张</div> <img src="/blog/assets/article/aboutMe/wxxiaochengxu1.png" class="cover-img"></div></div> <div class="custom-block tip"><p class="custom-block-title">核心功能</p> <p>1、通过 eggjs 搭建 node 服务器，部署阿里 linux 云 ECS 服务器，自建 mysql 数据库<br>
2、前端通过 taro 跨平台小程序框架搭建微信小程序，实现<code>扫码添加商品</code>功能</p></div> <div class="custom-block tip"><p class="custom-block-title">技术栈</p></div> <div class="custom-block tip"><p class="custom-block-title">结项感悟</p> <p>这个经历给了我很大的鼓舞，明白自己动手能力其实挺强</p></div> <div class="right-pendant"><a href="dingtalk://dingtalkclient/action/sendmsg?dingtalk_id=zpizb5p" class="pendant__icon"><img title="点击跳转钉钉联系我" src="/blog/assets/img/dingdinglogo.png" alt="点击跳转钉钉联系我"></a><a href="javascript:;" class="pendant__icon"><div class="img-container"><div><!----> <img src="/blog/assets/img/myqq.jpg" class="cover-img"></div></div></a><a href="javascript:;" class="pendant__icon"><div class="img-container"><div><!----> <img src="/blog/assets/img/mywx.jpg" class="cover-img"></div></div></a></div></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">更新时间:</span> <span class="time">2023年9月4日星期一上午10点30分</span></div></footer> <!----> </main></div><div class="global-ui"></div></div>
    <script src="/blog/assets/js/app.7b4540b9.js" defer></script><script src="/blog/assets/js/2.b0da3abb.js" defer></script><script src="/blog/assets/js/15.2996c9e2.js" defer></script><script src="/blog/assets/js/4.e142f4c4.js" defer></script><script src="/blog/assets/js/11.d9c57454.js" defer></script><script src="/blog/assets/js/6.e0517a23.js" defer></script>
  </body>
</html>
